package org.soderiakelvy.model.dao.imp;

import java.io.Serializable;
import java.util.ArrayList;

import java.util.List;


import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Conjunction;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.soderiakelvy.model.dao.SucursalDao;
import org.soderiakelvy.model.domain.SucursalVO;
import org.soderiakelvy.model.domain.SujetoVO;
import org.soderiakelvy.model.util.HibernateUtil;

public class SucursalDaoImp implements SucursalDao,Serializable{
	private static final long serialVersionUID = -1334370033323019908L;

	@Override
	public void insertSucursalVO(SucursalVO sucursal) throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		session.save(sucursal);
		session.getTransaction().commit();
		session.close();
	}

	@Override
	public void updateSucursalVO(SucursalVO sucursal) throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		session.update(sucursal);
		session.getTransaction().commit();
		session.close();	
		
	}

	@Override
	public void deleteSucursalVO(SucursalVO sucursal) throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		session.delete(sucursal);
		session.getTransaction().commit();
		session.close();
	}

	@Override
	public SucursalVO getSucursalVO(SucursalVO sucursal) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}
	
	@Override
	public SucursalVO getSucursalVOBySujetoNumeroSucursal(SujetoVO sujeto,
			Long numeroSucursal) throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
		Session session = sessionFactory.openSession();
		Criteria criteria = session.createCriteria(SucursalVO.class);
		criteria.add(Restrictions.eq("sujeto", sujeto));
		criteria.add(Restrictions.eq("numeroSucursal", numeroSucursal));
		SucursalVO sucursal =(SucursalVO) criteria.uniqueResult(); 
		session.close();
		return sucursal;
	}

	@Override
	public List<SucursalVO> getSucursalesFromSujeto(SujetoVO sujeto) throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
		Session session = sessionFactory.openSession();
		Criteria criteria = session.createCriteria(SucursalVO.class);
		criteria.add(Restrictions.eq("sujeto", sujeto));
		List<SucursalVO> sucursales = (ArrayList<SucursalVO>)criteria.list(); 
		session.close();	
		return sucursales;
	}

	@Override
	public SucursalVO getSucursalByNombre(String nombre) throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
		Session session = sessionFactory.openSession();
		Criteria criteria = session.createCriteria(SucursalVO.class);
		criteria.add(Restrictions.eq("nombre", nombre));
		SucursalVO sVO =(SucursalVO) criteria.uniqueResult(); 
		session.close();
		return sVO;
	}
	
	@Override
	public List<SucursalVO> getAllSucursalesByTipoSujeto(String tipoSujeto) throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        Criteria criteria = session.createCriteria(SucursalVO.class);
        criteria.createAlias("sujeto", "su");
        criteria.add(Restrictions.eq("su.tipoSujeto", tipoSujeto));
        List<SucursalVO> sucursales = criteria.list();
        session.close();
	        return sucursales;
	}

	@Override
	public List<SucursalVO> getSucursalesBySucursal(SucursalVO sucursal)
			throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        Criteria criteria = session.createCriteria(SucursalVO.class);
        Conjunction busquedaAnd = Restrictions.conjunction();
        busquedaAnd.add(Restrictions.like("nombre", sucursal.getNombre(), MatchMode.START));
        busquedaAnd.add(Restrictions.like("apellido", sucursal.getApellido(),MatchMode.START));
        criteria.add(busquedaAnd);
        List<SucursalVO> sucursales = criteria.list();
        session.close();
		return sucursales;
	}

	
}
